package GA.population;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import GA.chromosome.GAChrom;
import algorithm.AlgCtx;
import abstractGA.GAParameter;
import abstractGA.chrom.Chrom;
import abstractGA.popu.PopuBuilder;
import abstractGA.popu.Population;
/**
 * 带学习机制单目标GA的种群构建器
 * @author nyc
 *
 */
public class GAPopuBuilder extends PopuBuilder {
	//算法参数
	protected GAParameter parameter = null;
	//随机数类
	protected Random rnd = null;
	//染色体集合
	protected List<Chrom> chroms = null;
	//GA种群
	protected Population popu = null;

	public GAPopuBuilder() {
		//产生GA的种群
		popu = new GAPopu();
	}

	@Override
	/**
	 * 构造参数对象
	 * @param algCtx:算法运行上下文
	 */
	public void buildPara(AlgCtx algCtx) {
		parameter = new GAParameter(algCtx.getAlgCfgFileName());
		popu.setParameter(parameter);
	}

	@Override
	/**
	 * 构造染色体集合
	 * @param algCtx:算法运行上下文
	 */
	public void buildChroms(AlgCtx algCtx) {
		chroms = new ArrayList<Chrom>();
		int size = parameter.getPopuSize();
		for (int i = 0; i < size; i++) {
			/*
			 * 注意这里构造的染色体是带学习机制的
			 */
			Chrom chrom = new GAChrom(algCtx,parameter);
			chroms.add(chrom);
		}
		popu.setChroms(chroms);
	}

	@Override
	//获取构造好的种群
	public Population getPopu() {
		return popu;
	}

	@Override
	//构造随机数对象
	public void buildRandom() {
		rnd=new Random();
		popu.setRandom(rnd);
	}

}
